package com.hourse.platform.dao;

import com.hourse.platform.vo.PageList;
import org.hibernate.query.NativeQuery;
import org.hibernate.type.Type;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface BaseDao {

    /**
     * 通过HQL查询对象
     *
     * @param hql
     * @return Object
     */
    Object execSingleQuery(final String hql, final Map<String, Object> map);

    /**
     * 通过主键查询对象
     *
     * @param clazz
     * @param id
     * @return
     */
    Object getObjectBySerializableKey(Class clazz, Serializable id);


    /**
     * 根据主键删除 Object
     *
     * @param clazz
     * @param id
     */
    void deleteObjectSerializableKey(Class clazz, Serializable id) throws Exception;

    /**
     * 保存更新对象
     *
     * @param object
     * @throws Exception
     */
    void saveOrUpdate(Object object) throws Exception;

    /**
     * 保存
     *
     * @param obj
     * @throws Exception
     */
    void saveObject(Object obj) throws Exception;

    /**
     * 更新
     *
     * @param obj
     * @throws Exception
     */
    void updateObject(Object obj) throws Exception;

    /**
     * HQL 查询 集合
     *
     * @param hql
     * @param params
     * @return List
     */
    List getItemListByNativeHQL(final String hql, final Map<String, Object> params);


    /**
     * HQL 更新删除语句
     *
     * @param hql
     * @param params
     */
    int executeUpdate(final String hql, final Map<String, Object> params) throws Exception;


    /**
     * SQL 更新删除语句
     *
     * @param sql
     * @param params
     */
    int executeSqlUpdate(final String sql, final Map<String, Object> params) throws Exception;

    /**
     * 通过SQL查询
     *
     * @param sql
     * @param params
     * @return
     */
    Object execSingleQueryBySQL(final String sql, final Map<String, Object> params);


    /**
     * SQL 查询LIST
     *
     * @param sql
     * @param params
     * @return
     */
    List getItemListByNativeSQL(final String sql, final Map<String, Object> params);

    /**
     * SQL 查询LIST
     *
     * @param sql
     * @param params
     * @return
     */
    List getItemListByNativeSQL(final String sql, Class clazz, final Map<String, Object> params);

    /**
     * 执行HQL 分页
     *
     * @param hql
     * @param params
     * @param firstResult
     * @param maxResults
     * @return
     */
    List execQueryList(final String hql, final Map<String, Object> params, int firstResult, int maxResults);

    /**
     * 执行SQL 分页
     *
     * @param sql
     * @param params
     * @param firstResult
     * @param maxResults
     * @return
     */
    List execQueryListBySQL(final String sql, final Map<String, Object> params, int firstResult, int maxResults);

    /**
     * 获取分页数据
     *
     * @param sql  SQL语句
     * @param page 页号
     * @param rows 行数
     * @return
     */
    PageList getPageListByNativeSQL(final String sql, final Map<String, Object> params, final int page, final int rows);

    /**
     * 获取分页数据
     *
     * @param sql    SQL语句
     * @param params 参数
     * @param page   页号
     * @param rows   行数
     * @param clazz  实体对象(与表结构字段需对应)
     * @return
     */
    PageList getPageListByNativeSQL(final String sql, final Map<String, Object> params, final int page, final int rows, final Class<?> clazz);

    /**
     * 获取分页数据
     *
     * @param sql
     * @param params
     * @param entityMap
     * @param scalarMap
     * @param page
     * @param rows
     * @return
     */
    PageList getPageListByNativeSQL(final String sql, final Map<String, Object> params, final Map<String, Class> entityMap, final Map<String, Type> scalarMap, final Map<String, String> joinMap, final int page, final int rows);


    /**
     * 获取分页数据
     *
     * @param sql                   SQL语句
     * @param page                  页号
     * @param rows                  行数
     * @param convertRowDataService 数据转换接口
     * @return
     */
    PageList getPageListByNativeSQL(final String sql, final Map<String, Object> params, PageList.ConvertRowDataService convertRowDataService, final int page, final int rows);


    /**
     * 获取分页数据
     *
     * @param hql    HQL语句
     * @param params 参数
     * @param page   页号
     * @param rows   行数
     * @return
     */
    PageList getPageListByHQL(final String hql, final Map<String, Object> params, final int page, final int rows);

    /**
     * 使用 SQL 获取数据 返回 List<Map<String,Object>>
     *
     * @param sql    SQL
     * @param params 参数
     * @return List<Map                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               <                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               String                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               ,                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               Object>>
     */
    List<Map<String, Object>> getMapDataListByNativeSQL(String sql, Map<String, Object> params);

    /**
     * 通过SQL查询
     *
     * @param sql    SQL
     * @param params 参数
     * @return Map<String                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               ,                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               Object>
     */
    Map<String, Object> getSingleMapDataBySQL(final String sql, final Map<String, Object> params);


    /**
     * 创建 NativeQuery
     *
     * @param sql
     * @param params
     * @return
     */
    NativeQuery createNativeQuery(final String sql, final Map<String, Object> params);


    /**
     * 批量插入数据
     *
     * @param listData
     * @throws Exception
     */
    void batchInsertObject(List<?> listData) throws Exception;


    /**
     * 批量插入数据
     *
     * @param listData
     * @throws Exception
     */
    void batchsaveOrUpdateObject(List<?> listData) throws Exception;

    /**
     * 批量插入数据
     *
     * @param listData
     * @param batchSiz
     * @throws Exception
     */
    void batchInsertObject(List<?> listData, Integer batchSiz) throws Exception;

    /**
     * 批量插入数据
     *
     * @param sqlList
     * @throws Exception
     */
    void batchInsertSql(List<String> sqlList, Integer batchSiz) throws Exception;

    /**
     * currentSessionflush
     */
    void currentSessionflush();

    /**
     * currentSessionClear
     */
    void currentSessionClear();

    void merge(Object object) throws Exception;
}
